import cv2

def imgio(imgdir):
    img = cv2.imread(imgdir, 1)  # 读取图片文件, flag为0则读取为灰度图
    cv2.imshow("train", img)  # 在名为train的窗口中显示1.jpg
    cv2.waitKey(2000)  # 等待键盘操作，若参数非空则delay2000ms
    cv2.destroyAllWindows()  # 销毁所有窗口
    cv2.imwrite("E:/1.jpg", img) # 写文件


def getImgAttr(imgdir):
    image_Color = cv2.imread(imgdir) # 读取1.jpg
    print("获取彩色图像的属性：")
    print("shape =", image_Color.shape) # 打印彩色图像的（像素行数，像素列数，通道数）
    print("size =", image_Color.size) # 打印彩色图像包含的像素总数
    print("dtype =", image_Color.dtype) # 打印彩色图像的数据类型
    image_Gray = cv2.imread(imgdir, 0) # 把1.jpg读取为灰度图像
    print("获取灰度图像的属性：")
    print("shape =", image_Gray.shape) # 打印灰度图像的（像素行数，像素列数）
    print("size =", image_Gray.size) # 打印灰度图像包含的像素总数
    print("dtype =", image_Gray.dtype) # 打印灰度图像的数据类型


def manipulateImg(imgdir):
    image = cv2.imread(imgdir)
    cv2.imshow("img_01", image)  # 显示图2.7
    for i in range(241, 292):  # i表示横坐标，在区间[241, 291]内取值
        for j in range(168, 219):  # j表示纵坐标，在区间[168, 218]内取值
            image[i, j] = [255, 255, 255]  # 把区域内的所有像素都修改为白色
    cv2.imshow("img_02", image)  # 显示像素被修改后的图像
    cv2.waitKey()
    cv2.destroyAllWindows()  # 关闭所有的窗口时，销毁所有窗口.


def getPxValue(imgdir):
    img = cv2.imread(imgdir)  # 读取D盘根目录下的2.jpg
    px = img[291, 218]  # 坐标(291, 218)上的像素
    print("坐标[291, 218]的像素值：", px)
    print("blue：", img[291, 218, 0])
    print("green：", img[291, 218, 1])
    print("red：", img[291, 218, 2])


def cvtImgColor(imgdir):
    image = cv2.imread(imgdir)
    cv2.imshow("img_01", image) # 显示原图
    # 将图2.7从BGR色彩空间转换到GRAY色彩空间
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    cv2.imshow("GRAY", gray_image) # 显示灰度图像
    #color_image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) # 在上面彩色转灰度过程中信息已丢失，此语句会报错
    cv2.waitKey()
    cv2.destroyAllWindows()

def cvtBGR2HSV(imgdir):
    image = cv2.imread(imgdir)
    cv2.imshow("BGR", image)  # 显示原图
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    cv2.imshow("HSV", hsv_image)  # 用HSV色彩空间显示的图像
    cv2.waitKey()
    cv2.destroyAllWindows()

def splitBGR(imgdir):
    bgr_image = cv2.imread(imgdir)
    cv2.imshow("img_01", bgr_image)  # 显示原图
    b, g, r = cv2.split(bgr_image)  # 拆分其通道
    cv2.imshow("B", b)  # 显示B通道图像
    cv2.imshow("G", g)  # 显示G通道图像
    cv2.imshow("R", r)  # 显示R通道图像
    cv2.waitKey()
    cv2.destroyAllWindows()

def splitHSV(imgdir):
    bgr_image = cv2.imread(imgdir)
    cv2.imshow("img_01", bgr_image) # 显示原图
    # 转换到HSV色彩空间
    hsv_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv_image) # 拆分HSV图像中的通道
    cv2.imshow("H", h) # 显示HSV图像中的H通道图像
    cv2.imshow("S", s) # 显示HSV图像中的S通道图像
    cv2.imshow("V", v) # 显示HSV图像中的V通道图像
    cv2.waitKey()
    cv2.destroyAllWindows()


def mergeBGR(imgdir):
    bgr_image = cv2.imread(imgdir)
    cv2.imshow("img_01", bgr_image) # 显示图2.7
    b, g, r = cv2.split(bgr_image) # 拆分图2.7中的通道
    bgr = cv2.merge([b, g, r]) # 按B→G→R的顺序合并通道
    cv2.imshow("BGR", bgr)
    cv2.waitKey()
    cv2.destroyAllWindows()


def mergeHSV(imgdir):
    bgr_image = cv2.imread(imgdir)
    cv2.imshow("img_01", bgr_image)  # 显示图2.7
    # 把图2.7从BGR色彩空间转换到HSV色彩空间
    hsv_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv_image)  # 拆分HSV图像中的通道
    hsv = cv2.merge([h, s, v])  # 合并拆分后的通道图像
    cv2.imshow("HSV", hsv)  # 显示合并通道的HSV图像
    cv2.waitKey()
    cv2.destroyAllWindows()


def imgBGRA(imgdir):
    bgr_image = cv2.imread(imgdir)
    # 把图2.7从BGR色彩空间转换到BGRA色彩空间
    bgra_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2BGRA)
    cv2.imshow("BGRA", bgr_image)  # 显示BGRA图像
    b, g, r, a = cv2.split(bgra_image)  # 拆分BGRA图像中的通道
    a[:, :] = 172  # 将BGRA图像的透明度调整为172（半透明）
    bgra_172 = cv2.merge([b, g, r, a])  # 合并拆分后并将透明度调整为172的通道图像
    a[:, :] = 0  # 将BGRA图像的透明度调整为0（透明）
    bgra_0 = cv2.merge([b, g, r, a])  # 合并拆分后并将透明度调整为0的通道图像
    cv2.imshow("A = 172", bgra_172)  # 显示透明度为172的BGRA图像
    cv2.imshow("A = 0", bgra_0)  # 显示透明度为0的BGRA图像
    cv2.imwrite("D:/bgra_origin.png", bgra_image)  # 写文件，PNG是典型的BGRA图像
    cv2.imwrite("D:/bgra_170.png", bgra_172)  # 写文件
    cv2.imwrite("D:/bgra_0.png", bgra_0)  # 写文件
    cv2.waitKey()
    cv2.destroyAllWindows()


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    #imgdir1 = "E:/PDF/AI/pythonOpenCV/sorcecode/02/01/1.jpg"
    # imgio(imgdir1) # 读写图片文件
    #getImgAttr(imgdir1) # 获取图片属性：像素（行数、列数、通道数）、总数size=行数*列数*通道数、dtype数据类型
    imgdir2 = "D:/OpenCV_sorceCode/02/05/2.jpg"
    #getPxValue(imgdir2) # 获取某个坐标点的像素值
    #manipulateImg(imgdir2) # 操作指定坐标像素点的值
    #cvtImgColor(imgdir2) # 转换色彩空间
    #cvtBGR2HSV(imgdir2) # BGR色彩空间转HSV色彩空间
    #splitBGR(imgdir2) # 拆分BGR各个通道，结果为灰度图，如(R,R,R)
    #splitHSV(imgdir2) # 拆分HSV通道(色调，饱和度，明暗度)
    #mergeBGR(imgdir2) # BGR图拆分后合并，可得到原图
    #mergeHSV(imgdir2) # HSV图拆分后合并，得不到原图
    imgBGRA(imgdir2)
# See PyCharm help at https://www.jetbrains.com/help/pycharm/
